﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

//int main()
//{
//	int a = 10;
//	//   00000000 00000000 00000000 00001010   原码 反码  补码
//	//0x 00 00 00 0A
//	//0A 00 00 00    内存中表示
//
//	int b = -20;
//	//   10000000 00000000 00000000 00010100   原码
//	//   11111111 11111111 11111111 11101011   反码
//	//   11111111 11111111 11111111 11101100   补码
//	//0x ff ff ff ec
//	//ec ff ff ff 
//	return 0;
//}


//判断大小端
//int main()
//{
//	int a = 1;
//	if (*(char*)&a == 1)
//	{
//		printf("小端\n");
//	}
//	else
//	{
//		printf("大端\n");
//	}
//	return 0;
//}

//int main()
//{
//	char a = 128;
//	printf("%d\n", a);
//	return 0;
//}



//#include <stdio.h>
//int main()
//{
//	char a = -1;
//	//10000000 00000000 00000000 00000001    -1原码
//	//11111111 11111111 11111111 11111111    -1补码
//	//11111111  赋值给char类型的a截断(当前为补码)  放入a中
//
//	signed char b = -1;    //char在当前环境下默认就是signed char 因此两者相同
//
//
//	unsigned char c = -1;
//	//10000000 00000000 00000000 00000001    -1原码
//    //11111111 11111111 11111111 11111111    -1补码
//    //11111111  赋值给char类型的a截断(当前为补码)  放入a中
//	//以%d打印c
//	//00000000 00000000 00000000 11111111    整型提升因为c是无符号数所以高位补0
//	//255
//
//
//	//以%d打印a
//	//11111111 11111111 11111111 11111111     先整型提升a(a当前是补码) a是有符号数高位补与符号位相同的数
//	//10000000 00000000 00000000 00000001     转化为原码打印出来
//	//-1
//	printf("a=%d,b=%d,c=%d", a, b, c);
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	char a = -128;
//	//10000000 00000000 00000000 10000000    -128原码
//	//11111111 11111111 11111111 10000000    -128补码
//	//10000000  截断放入a中
//
//	//11111111 11111111 11111111 10000000    a为有符号数  整型提升 高位补1
//	//以无符号数打印 很大很大的一个数比int最大值还大4294967168
//	printf("%u\n", a);
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	char a = 128;
//	//00000000 00000000 00000000 10000000    128原码
//	//00000000 00000000 00000000 10000000    128补码
//	//10000000  截断放入a中
//
//	//11111111 11111111 11111111 10000000    a为有符号数  整型提升 高位补1
//	//以无符号数打印 很大很大的一个数比int最大值还大4294967168
//	printf("%u\n", a);
//	return 0;
//}


//int main()
//{
//	char a[1000];
//	int i;
//	for (i = 0; i < 1000; i++)
//	{
//		a[i] = -1 - i;
//		//a[i]的取值范围是-128~127  当i=128时 a[i]=127  i=129时 a[i]=126 .....a=255时 a=[i]=0;
//	}
//	printf("%d", strlen(a));  //strlen是找到元素为0时就停下 所以结果为255
//	return 0;
//}


//unsigned char i = 0;  //i的范围 0~255
//int main()
//{
//	for (i = 0; i <= 255; i++)     //判断条件i<=255恒成立  因此循环会一直进行下去
//	{
//		printf("hello world\n");
//	}
//	return 0;
//}

//#include<Windows.h>
//int main()
//{
//	unsigned int i;   //i的范围是0~4294967295
//	for (i = 9; i >= 0; i--)      //判断条件i>=0恒成立  因此循环会一直进行下去
//	{
//		printf("%u\n", i);
//		Sleep(500);
//	}
//	return 0;
//}

//#include <stdio.h>
////X86环境 ⼩端字节序
//int main()
//{
//	int a[4] = { 1, 2, 3, 4 };   
//	//01 00 00 00 
//	//    ^将a的首元素地址变为整型然后加1指向这里 然后转换为int* 
//	//02 00 00 00
//	// ^解引用后一次访问四个字节 从此上面一排指向的00处开始访问当前位置，并且以小端字节序存储的 所以输出为02 00 00 00 
//	//03 00 00 00
//	//04 00 00 00
//	int* ptr1 = (int*)(&a + 1);
//	int* ptr2 = (int*)((int)a + 1);   
//	printf("%x,%x", ptr1[-1], *ptr2);  
//	//04 00 00 04  
//	//02 00 00 00  
//	return 0;
//}

//int main()
//{
//	unsigned char a = 200;
//	//00000000 00000000 00000000 11001000
//	//11001000 截断
//	unsigned char b = 100;
//	//00000000 00000000 00000000 01100100
//	//01100100 截断
//	unsigned char c = 0;
//	c = a + b;
//
//	//a+b
//	//00000000 00000000 00000000 11001000
//	//00000000 00000000 00000000 01100100
//	//00000000 00000000 00000001 00101100    //300
//	//00101100 截断 44
//
//
//	printf("%d   %d", a + b, c);
//	return 0;
//}

//写一个函数判断当前机器是大端还是小端，如果是小端返回1，如果是大端返回0.
//int check()
//{
//	int a = 1;
//	if (*(char*)&a == 1)
//		return 1;
//	else
//		return 0;
//}
//
//int main()
//{
//	int ret = check();
//	if (ret)
//		printf("小端");
//	else
//		printf("大端");
//	return 0;
//}

//#include<stddef.h>
//typedef struct s1
//{
//	char a;
//	char b;
//	int c;
//}s1;
//
//typedef struct s2
//{
//	char a;
//	int c;
//	char b;
//}s2;
//
//typedef struct s3
//{
//	char a;
//	struct s1 s;
//	char b;
//}s3;
//
//int main()
//{
//	//printf("%zd\n", sizeof(s1));
//	//printf("%zd\n", sizeof(s2));
//	//printf("%zd\n", sizeof(s3));
//
//	printf("%d\n", offsetof(s1, a));
//	printf("%d\n", offsetof(s1, b));
//	printf("%d\n", offsetof(s1, c));
//}

#pragma pack(1)
struct s1
{
	char c1;
	int b;
	char c2;
};
#pragma pack()

int main()
{
	printf("%zd\n", sizeof(struct s1));
	return 0;
}